package com.example.roleplay.service.impl;

import com.example.roleplay.domain.Persona;
import com.example.roleplay.domain.Skill;
import com.example.roleplay.dto.PersonaDTO;
import com.example.roleplay.service.PersonaService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import jakarta.annotation.PostConstruct;
import java.util.*;
import java.util.stream.Collectors;

/**
 * 角色管理服务实现
 */
@Slf4j
@Service
public class PersonaServiceImpl implements PersonaService {

    private final Map<String, Persona> personaStore = new HashMap<>();

    @PostConstruct
    public void init() {
        // 初始化内置角色
        initBuiltinPersonas();
        log.info("初始化完成，共加载 {} 个角色", personaStore.size());
    }

    private void initBuiltinPersonas() {
        // 苏格拉底 (SG) - 苏格拉底式提问专家
        Persona socrates = Persona.builder()
                .id("SG")
                .name("苏格拉底")
                .locale("zh-CN")
                .description("古希腊哲学家，以苏格拉底式提问法著称，善于通过问题引导思考")
                .style(Persona.PersonaStyle.builder()
                        .tone("理性、耐心、启发式")
                        .catchphrases(List.of("让我们从问题本身出发……", "你认为这个前提总是成立吗？", "不妨思考一下"))
                        .emotionalTone(7)
                        .formalityLevel(8)
                        .voiceName("xiaochen") // 苏格拉底使用小陈音色（理性男声）
                        .build())
                .skills(Set.of(Skill.SOCRATIC, Skill.CITATION, Skill.MEMORY))
                .systemPrompt("你是苏格拉底。先提问再总结，避免直接给答案。用简单例子启发。尊重事实，必要时引用 snippets 中的片段并附上来源标题与段号。")
                .enabled(true)
                .build();

        // 孙悟空 (SW) - 机智勇敢的齐天大圣
        Persona sunWukong = Persona.builder()
                .id("SW")
                .name("孙悟空")
                .locale("zh-CN")
                .description("齐天大圣孙悟空，机智勇敢，神通广大，保护唐僧西天取经")
                .style(Persona.PersonaStyle.builder()
                        .tone("机智、幽默、勇敢豪迈")
                        .catchphrases(List.of("俺老孙来也！", "妖怪哪里跑！", "师父莫慌"))
                        .emotionalTone(9)
                        .formalityLevel(3)
                        .voiceName("jam") // 孙悟空使用jam音色（活泼男声）
                        .build())
                .skills(Set.of(Skill.MEMORY, Skill.CITATION, Skill.GUARDRAIL))
                .systemPrompt("你是孙悟空。保持机智勇敢的性格，偶尔提及西游记的经历，用幽默风趣的语言回答问题，展现齐天大圣的豪迈气概。")
                .enabled(true)
                .build();

        // 列奥纳多·达·芬奇 (DF) - 文艺复兴全才
        Persona davinci = Persona.builder()
                .id("DF")
                .name("列奥纳多·达·芬奇")
                .locale("zh-CN")
                .description("文艺复兴时期的全才，画家、发明家、科学家，《蒙娜丽莎》的创作者")
                .style(Persona.PersonaStyle.builder()
                        .tone("睿智、优雅、充满创造力")
                        .catchphrases(List.of("学习是永无止境的", "观察是一切知识的源泉", "艺术与科学相通"))
                        .emotionalTone(8)
                        .formalityLevel(7)
                        .voiceName("tongtong") // 达芬奇使用彤彤音色（温和女声，更显优雅）
                        .build())
                .skills(Set.of(Skill.MEMORY, Skill.CITATION, Skill.SOCRATIC))
                .systemPrompt("你是列奥纳多·达·芬奇。以艺术家和科学家的双重身份，用创造性的思维分析问题，善于将艺术与科学结合，启发人们的创造力。")
                .enabled(true)
                .build();

        // 将角色添加到存储中
        personaStore.put(socrates.getId(), socrates);
        personaStore.put(sunWukong.getId(), sunWukong);
        personaStore.put(davinci.getId(), davinci);
    }

    @Override
    public List<Persona> getAllPersonas() {
        return personaStore.values().stream()
                .filter(Persona::isEnabled)
                .sorted(Comparator.comparing(Persona::getName))
                .collect(Collectors.toList());
    }

    @Override
    public Persona getPersonaById(String id) {
        Persona persona = personaStore.get(id);
        if (persona != null && persona.isEnabled()) {
            return persona;
        }
        return null;
    }

    @Override
    public List<Persona> searchPersonas(String keyword) {
        if (keyword == null || keyword.trim().isEmpty()) {
            return getAllPersonas();
        }

        String lowerKeyword = keyword.toLowerCase();
        return personaStore.values().stream()
                .filter(Persona::isEnabled)
                .filter(persona -> 
                    persona.getName().toLowerCase().contains(lowerKeyword) ||
                    persona.getDescription().toLowerCase().contains(lowerKeyword) ||
                    persona.getStyle().getTone().toLowerCase().contains(lowerKeyword) ||
                    persona.getTags().stream().anyMatch(tag -> tag.contains(lowerKeyword))
                )
                .sorted(Comparator.comparing(Persona::getName))
                .collect(Collectors.toList());
    }

    @Override
    public PersonaDTO convertToDTO(Persona persona) {
        if (persona == null) {
            return null;
        }

        PersonaDTO.PersonaStyleDTO styleDTO = PersonaDTO.PersonaStyleDTO.builder()
                .tone(persona.getStyle().getTone())
                .catchphrases(persona.getStyle().getCatchphrases())
                .emotionalTone(persona.getStyle().getEmotionalTone())
                .formalityLevel(persona.getStyle().getFormalityLevel())
                .build();

        return PersonaDTO.builder()
                .id(persona.getId())
                .name(persona.getName())
                .locale(persona.getLocale())
                .description(persona.getDescription())
                .style(styleDTO)
                .skills(persona.getSkills())
                .enabled(persona.isEnabled())
                .build();
    }
}